package db

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
	"go-admin/global"
	"go-admin/pkg/setting"
	"time"
)

var (
	DBEngine *gorm.DB
)

func newDBEngine(databaseSetting *setting.DatabaseSetting) (*gorm.DB, error) {
	db, err := gorm.Open(
		databaseSetting.DBType,
		fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=%t&loc=Local",
			databaseSetting.Username,
			databaseSetting.Password,
			databaseSetting.Host,
			databaseSetting.DBName,
			databaseSetting.Charset,
			databaseSetting.ParseTime,
		),
	)
	if err != nil {
		return nil, err
	}
	if global.ServerSetting.RunMode == "debug" {
		db.LogMode(true)
	}
	// 禁用默认表名的复数形式，如果置为true，则 `User` 的默认表名为 `user`
	db.SingularTable(true)
	// 在创建的时候的回调处理
	db.Callback().Create().Replace("gorm:update_time_stamp", updateCreateCallBack)
	// 更新 TODO 暂时不适用 因为目前都是假删除，使用的update 所以会有冲突，暂时没有找到方法解决
	//db.Callback().Update().Replace("gorm:update_time_stamp", updateUpdateCallBack)

	db.DB().SetMaxIdleConns(databaseSetting.MaxIdleConns) // 空闲连接数
	db.DB().SetMaxOpenConns(databaseSetting.MaxOpenConns) // 最大连接数

	//otgorm.AddGormCallbacks(db)
	return db, nil
}

// 初始化gorm
func SetupDBEngine() error {
	var err error
	DBEngine, err = newDBEngine(global.DatabaseSetting)
	if err != nil {
		return err
	}
	return nil
}

// 创建之前的回调, 在这里处理公共字段
func updateCreateCallBack(scope *gorm.Scope) {
 	if !scope.HasError() {
		// 当前时间的秒数
		nowTime := time.Now().Local().Unix()
		// 判断字段是否为空
		if createdOn, ok := scope.FieldByName("CreatedOn"); ok {
			if createdOn.IsBlank {
				_ = createdOn.Set(nowTime)
			}
		}
	}
}

// 注册更新钩子在持久化之前
//func updateUpdateCallBack(scope *gorm.Scope) {
//	if _, ok := scope.Get("gorm:update_column"); !ok {
//		scope.SetColumn("UpdatedAt", scope.db.nowFunc())
//	}
//}
